\documentclass{article}

\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{verbatim}
\usepackage[pdftex]{graphicx,color}
\usepackage[section]{placeins}
\usepackage{amsmath}
\usepackage{verbatim}

% Sarpadísima tipografía para listings y \texttt
\usepackage{inconsolata}

\usepackage{xcolor}

% Para ejemplos de código.
\usepackage{listings}
\lstset{language=Oz
  ,basicstyle=\ttfamily\small % Usa inconsolata
  ,identifierstyle=\ttfamily
  ,keywordstyle=\color[rgb]{0,0,1}
  ,commentstyle=\color[rgb]{0.133,0.545,0.133}
  ,stringstyle=\color[rgb]{0.627,0.126,0.941}
  ,morekeywords={true,false}
  ,showstringspaces=false     % No muestra underscores en los espacios de los strings.
  ,backgroundcolor=\color{red!10} % Un color suave de fondo (menos chocante que el frame=single)
  ,breaklines=false            % Wrappea las lineas automáticamente.
  ,belowskip=0pt               % Reduce el espacio entre un listing y el párrafo siguiente
  ,inputencoding=utf8
  ,literate={á}{{\'a}}1
           {é}{{\'e}}1
           {í}{{\'i}}1
           {ó}{{\'o}}1
           {ú}{{\'u}}1
  %frame=single               % Un recuadro en los listings.
}

\author{Martin Paulucci}
\title{Teoría de Lenguaje [75.31]\\
Trabajo Práctico Individual}

\begin{document}

\maketitle

\bigskip

\tableofcontents
\newpage

\section{Introduccion}

El objetivo del trabajo practico es desarrollar un programa que simule el ordenamiento de vagones de un tren.

\section{Diseño general}

\subsection{Lista.oz}
El archivo \emph{Lista.oz} contiene toda la funcionalidad utilizada en el trabajo practico referente a la manipulacion de listas.

\subsubsection{Longitud}
Esta funcion obtiene una lista, y calcula el tamanio de la misma como 1 + (tamanio de la cola de la lista).
\begin{lstlisting}
fun {Longitud Xs}
	case Xs of _|T then 1 + {Longitud T}
	else 0
	end
end
\end{lstlisting}

\subsubsection{Tomar}
Esta funcion toma los primeros elementos de la lista pasada por parametro. Esto se calcula de esta manera: Si N es igual a 0, no devolver nil. En caso contrario devolver el primer elemento de la lista, y llamar recursivamente pidiendo N-1 elementos a la cola de la lista.   
\begin{lstlisting}
fun {Tomar Xs N}
	if {Longitud Xs} < N then Xs
	else
		case Xs of H|T then
			if N == 0 then nil
			else H|{Tomar T N-1} 
			end
		else 
			nil	end		
	end
end
\end{lstlisting}

\subsubsection{Eliminar}
La funcion \emph{Eliminar} se encarga de eliminar los primeros N elementos de la lista. Es muy parecida a \emph{Tomar}, la diferencia radica en que cuando llega a la condicion de corte(N == 0), devuelve la cola de la lista, dejando asi afuera a los primeros N elementos.
\begin{lstlisting}
fun {Eliminar Xs N}
	if N == 0 then Xs
	else 
		case Xs of _|T then
			{Eliminar T N-1}
		else nil
		end				 
	end
end
\end{lstlisting}


\subsubsection{Agregar}
La funcion \emph{Agregar} concatena dos listas. Va iterando recursivamente hasta llegar al final de la primera lista, y en ese moment devuelve la segunda lista como cola de la primera.
\begin{lstlisting}
fun {Agregar Xs Ys}
	case Xs of H|T then
		H|{Agregar T Ys}
	else Ys
	end
end
\end{lstlisting}


\subsubsection{Miembro}
La funcion \emph{Miembro} devuelve \emph{true} o \emph{false} dependiendo si el segundo argumento forma parte de la lista, o no. Para obtener el resultado se itera recursivamente por la lista hasta encontrar un componente que sea igual al buscarlo. De encontrarlo, se devuelve \emph{true}, de caso constrario, si se termino de iterar sobre la lista, se devuelve \emph{false}.
\begin{lstlisting}
fun {Miembro Xs Y}
	case Xs of H|T then
		if H == Y then true
		else {Miembro T Y}
		end
	else false
	end
end
\end{lstlisting}


\subsubsection{Posicion}
La funcion \emph{Posicion} supone que el elemento buscado(Y) se encuentra en la lista pasada por parametro(Xs). Bajo esta premisa, se devuelve \textit{1 + la posicion del elemento buscado en la cola de la lista}.
\begin{lstlisting}
fun {Posicion Xs Y}
	case Xs of H|T then
		if H == Y then 1
		else 1 + {Posicion T Y}
		end
	end
end
\end{lstlisting}
    
      
\subsection{Trenes.oz}
El archivo \emph{Trenes.oz} contiene todo lo relativo al manejo y manipulacion de trenes, vagones, estados, etc\dots   
   
\subsubsection{AplicarMovimientos}
La funcion \emph{AplicarMovimientos} simplemente concatena muchas llamadas a la funcion mas importante \emph{Aplicar Movimiento}.
\begin{lstlisting}
fun {AplicarMovimientos E Ms}
	case Ms of nil then [E]
	[] M|Mr then 
	  E|{AplicarMovimientos {AplicarMovimiento E M} Mr}
	end				
end
\end{lstlisting}
(ver \ref{MoverVagones})
\begin{lstlisting}
fun {AplicarMovimiento E M}
	case M of uno(N) then
		Ec = {MoverVagones E.principal E.uno N}
		in
		estado(principal:Ec.1 uno:Ec.2 dos:E.dos)
	[] dos(N) then
		Ec = {MoverVagones E.principal E.dos N}
		in
		estado(principal:Ec.1 uno:E.uno dos:Ec.2)
	end      
end
\end{lstlisting}

\subsubsection{CalcularMovimientos}
\begin{lstlisting}
\end{lstlisting}

\subsubsection{PartirTren}
\begin{lstlisting}
\end{lstlisting}

\subsubsection{MoverVagones}\label{MoverVagones}
\begin{lstlisting}
fun {MoverVagones Ps Vs N}
	if N < 0 then
	  {Lista.agregar Ps {Lista.tomar Vs ~N}}
				#{Lista.eliminar Vs ~N}
	elseif N > 0 then 
		L = {Lista.longitud Ps} - N 
	in
		{Lista.tomar Ps L}#
		{Lista.agregar {Lista.eliminar Ps L} Vs}
	else Ps#Vs end
end
\end{lstlisting}

\section{Manual de Usuario}
\end{document}
